<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>
        手写bind函数
        原理:
        1.是对函数操作的；
        2.要加在函数的原型上边；
        3.
        //参数 function.bind(thisArg[, arg1[, arg2[, ...]]])
            thisArg:调用绑定函数时作为 this 参数传递给目标函数的值。
            arg1, arg2, ...
                当目标函数被调用时，被预置入绑定函数的参数列表中的参数。
        //返回值
        返回一个原函数的拷贝，并拥有指定的 this 值和初始参数

    </div>
</body>
<script>
    function myBind(that, ...arg) { //创建时保存bind中传进来的arg
        console.log(that)
        console.log(...arg)
        const _Fn = this    //保存sum函数
        return function () {
            console.log(arguments)
            const args = [...arg, ...arguments]   //合并两次传递进来的参数
            return _Fn.apply(that, args)  //调用sum函数的myApply方法
        }
    }
    Function.prototype.myBind = myBind
    if(!Function.prototype.bind){
        Function.prototype.bind = function(){
            var self = this
            var thatArg = arguments[0];
            var args = Array.prototype.slice.call(arguments,1);
            if (typeof self !== 'function'){
                throw new TypeError('this is no Function')
            }
            return function(){
                var funcArgs = args.concat(Array.prototype.slice.call(arguments))
                return self.apply(thatArg,funcArgs)
            }
        }
    }

        const module = {
            x: 42,
            getX: function() {
                return this.x;
            }
        };
        const unboundGetX = module.getX;
        console.log(unboundGetX()); // The function gets invoked at the global scope
        // expected output: undefined
        const boundGetX = unboundGetX.myBind(module);
        console.log(boundGetX());
        // expected output: 42
        </script>
</html>